﻿package lu.kyle {
	public final class ZigZagIntList {
		public var data:int;
		public var next:ZigZagIntList;
		public var zznext:ZigZagIntList;
		public function ZigZagIntList(dt:int, nx:ZigZagIntList, zz:ZigZagIntList) {
			data = dt;
			next = nx;
			zznext = zz;
		}
		/*
		private static var ZigZag:Array = [
			 0, 1, 5, 6,14,15,27,28,
			 2, 4, 7,13,16,26,29,42,
			 3, 8,12,17,25,30,41,43,
			 9,11,18,24,31,40,44,53,
			10,19,23,32,39,45,52,54,
			20,22,33,38,46,51,55,60,
			21,34,37,47,50,56,59,61,
			35,36,48,49,57,58,62,63
		];
		*/
		public static function create(src:Array):ZigZagIntList {
			if (!(src && src.length == 64)) return null;

			var dst63:ZigZagIntList = new ZigZagIntList(src[63], null, null);
			var dst62:ZigZagIntList = new ZigZagIntList(src[62], dst63, dst63);
			var dst61:ZigZagIntList = new ZigZagIntList(src[61], dst62, null);
			var dst60:ZigZagIntList = new ZigZagIntList(src[60], dst61, null);

			var dst59:ZigZagIntList = new ZigZagIntList(src[59], dst60, dst61);
			var dst58:ZigZagIntList = new ZigZagIntList(src[58], dst59, dst62);
			var dst57:ZigZagIntList = new ZigZagIntList(src[57], dst58, dst58);
			var dst56:ZigZagIntList = new ZigZagIntList(src[56], dst57, dst59);
			var dst55:ZigZagIntList = new ZigZagIntList(src[55], dst56, dst60);
			var dst54:ZigZagIntList = new ZigZagIntList(src[54], dst55, null);
			var dst53:ZigZagIntList = new ZigZagIntList(src[53], dst54, null);
			var dst52:ZigZagIntList = new ZigZagIntList(src[52], dst53, dst54);
			var dst51:ZigZagIntList = new ZigZagIntList(src[51], dst52, dst55);
			var dst50:ZigZagIntList = new ZigZagIntList(src[50], dst51, dst56);

			var dst49:ZigZagIntList = new ZigZagIntList(src[49], dst50, dst57);
			var dst48:ZigZagIntList = new ZigZagIntList(src[48], dst49, dst49);
			var dst47:ZigZagIntList = new ZigZagIntList(src[47], dst48, dst50);
			var dst46:ZigZagIntList = new ZigZagIntList(src[46], dst47, dst51);
			var dst45:ZigZagIntList = new ZigZagIntList(src[45], dst46, dst52);
			var dst44:ZigZagIntList = new ZigZagIntList(src[44], dst45, dst53);
			var dst43:ZigZagIntList = new ZigZagIntList(src[43], dst44, null);
			var dst42:ZigZagIntList = new ZigZagIntList(src[42], dst43, null);
			var dst41:ZigZagIntList = new ZigZagIntList(src[41], dst42, dst43);
			var dst40:ZigZagIntList = new ZigZagIntList(src[40], dst41, dst44);

			var dst39:ZigZagIntList = new ZigZagIntList(src[39], dst40, dst45);
			var dst38:ZigZagIntList = new ZigZagIntList(src[38], dst39, dst46);
			var dst37:ZigZagIntList = new ZigZagIntList(src[37], dst38, dst47);
			var dst36:ZigZagIntList = new ZigZagIntList(src[36], dst37, dst48);
			var dst35:ZigZagIntList = new ZigZagIntList(src[35], dst36, dst36);
			var dst34:ZigZagIntList = new ZigZagIntList(src[34], dst35, dst37);
			var dst33:ZigZagIntList = new ZigZagIntList(src[33], dst34, dst38);
			var dst32:ZigZagIntList = new ZigZagIntList(src[32], dst33, dst39);
			var dst31:ZigZagIntList = new ZigZagIntList(src[31], dst32, dst40);
			var dst30:ZigZagIntList = new ZigZagIntList(src[30], dst31, dst41);

			var dst29:ZigZagIntList = new ZigZagIntList(src[29], dst30, dst42);
			var dst28:ZigZagIntList = new ZigZagIntList(src[28], dst29, null);
			var dst27:ZigZagIntList = new ZigZagIntList(src[27], dst28, dst28);
			var dst26:ZigZagIntList = new ZigZagIntList(src[26], dst27, dst29);
			var dst25:ZigZagIntList = new ZigZagIntList(src[25], dst26, dst30);
			var dst24:ZigZagIntList = new ZigZagIntList(src[24], dst25, dst31);
			var dst23:ZigZagIntList = new ZigZagIntList(src[23], dst24, dst32);
			var dst22:ZigZagIntList = new ZigZagIntList(src[22], dst23, dst33);
			var dst21:ZigZagIntList = new ZigZagIntList(src[21], dst22, dst34);
			var dst20:ZigZagIntList = new ZigZagIntList(src[20], dst21, dst22);

			var dst19:ZigZagIntList = new ZigZagIntList(src[19], dst20, dst23);
			var dst18:ZigZagIntList = new ZigZagIntList(src[18], dst19, dst24);
			var dst17:ZigZagIntList = new ZigZagIntList(src[17], dst18, dst25);
			var dst16:ZigZagIntList = new ZigZagIntList(src[16], dst17, dst26);
			var dst15:ZigZagIntList = new ZigZagIntList(src[15], dst16, dst27);
			var dst14:ZigZagIntList = new ZigZagIntList(src[14], dst15, dst15);
			var dst13:ZigZagIntList = new ZigZagIntList(src[13], dst14, dst16);
			var dst12:ZigZagIntList = new ZigZagIntList(src[12], dst13, dst17);
			var dst11:ZigZagIntList = new ZigZagIntList(src[11], dst12, dst18);
			var dst10:ZigZagIntList = new ZigZagIntList(src[10], dst11, dst19);

			var dst09:ZigZagIntList = new ZigZagIntList(src[9], dst10, dst11);
			var dst08:ZigZagIntList = new ZigZagIntList(src[8], dst09, dst12);
			var dst07:ZigZagIntList = new ZigZagIntList(src[7], dst08, dst13);
			var dst06:ZigZagIntList = new ZigZagIntList(src[6], dst07, dst14);
			var dst05:ZigZagIntList = new ZigZagIntList(src[5], dst06, dst06);
			var dst04:ZigZagIntList = new ZigZagIntList(src[4], dst05, dst07);
			var dst03:ZigZagIntList = new ZigZagIntList(src[3], dst04, dst08);
			var dst02:ZigZagIntList = new ZigZagIntList(src[2], dst03, dst04);
			var dst01:ZigZagIntList = new ZigZagIntList(src[1], dst02, dst05);
			var dst00:ZigZagIntList = new ZigZagIntList(src[0], dst01, dst01);

			dst61.zznext = dst35;
			dst60.zznext = dst21;
			dst54.zznext = dst20;
			dst53.zznext = dst10;
			dst43.zznext = dst09;
			dst42.zznext = dst03;
			dst28.zznext = dst02;

			return dst00;
		}
	}
}
